package com.递归;

import java.util.Scanner;

/**
 * 角谷定理。输入一个自然数，若为偶数，则把它除以2，若为奇数，则把它乘以3加1。经过如此有限次运算后，总可以得到自然数值1。求经过多少次可得到自然数1。
 * 如：输入22，
 * 输出 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
 * STEP=16
 *
 * 由题意可知应将输入数据分为1，偶数，奇数三种情况，分别进行分支处理。当经过选择递归后，当n 变为1后，程序到达递归出口。
 * ————————————————
 * 版权声明：本文为CSDN博主「却水」的原创文章，遵循 CC 4.0 BY-SA 版权协议，转载请附上原文出处链接及本声明。
 * 原文链接：https://blog.csdn.net/qq_41753944/article/details/90718515
 */
public class 角谷定理 {
    static class Solution{
        int step = 1;
        public void KakutaniTheorem(int num){
            System.out.print(num+" ");
            if(num == 1){
                return ;
            }
            step++;
            //能整除
           if( num % 2 == 0){
               KakutaniTheorem(num/2);
           }
           //不能整队
           else{
               KakutaniTheorem(num*3+1);
           }
        }
    }

    public static void main(String[] args) {

        while (true) {
            System.out.println("输入一个整数");

            Scanner scanner = new Scanner(System.in);
            int number = scanner.nextInt();
           if(number==0){
                System.exit(1);
           }
            Solution solution = new Solution();
            solution.KakutaniTheorem(number);
            System.out.println("");

            System.out.println("步 数："+solution.step);
        }
    }
}

